<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        /*  内存 */

        // 栈内存  
        // 基本类型  或者简单数据类型

        // 堆内存  复杂数据类型  
        // 函数是复杂数据类型  
        // 函数名 在栈内存 
        // 函数体 在堆内存  

        // 堆内存的地址 会给到函数名所在的栈内存  
        // 所以复杂数据类型又叫引用类型  


        // 1.函数定义阶段   
        //function test(形参){执行的代码}
        // var test = function(形参){执行的代码 }

        // 1.1在堆内存中开辟一个空间 栈内存开一个新空间存
        // 函数名       
        // 1.2把函数体内的代码 一模一样的存储到这个空间内 
        // 1.3将堆内存的地址 给到 函数名所在的栈内存空间 

        //2.函数调用阶段  

        // 2.1 函数名所在的栈内存空间 按照地址找到堆内存空间  
            // 先判断 栈内存空间是否存在  
            // 再看 栈内存中的堆内存地址是否存在  
        // 2.2 在栈里边开辟一个新的空间 叫执行空间  
        // 2.3 在执行空间内部 对形参进行赋值 
        // 2.4 在执行空间内 进行函数内的预解析  
        // 2.5 预解析完成接下来就是在执行空间内部 把函数体内的代码
        // 挨个执行一遍 
        // 2.6 执行完毕以后 这个执行空间就会被销毁   

        function test(num1){
            console.log(num1);
        }

        function test2(){}


        test(100);

    </script>
</body>
</html>